# 主图截取函数, 把主图与副图分开
# 能过找黑色空行的方式.
# 使用时, 记得关闭弹幕

import numpy as np
import logging

def find_black_separators(kline_img, min_black_ratio=0.95):
    """
    查找K线图像中的黑色分隔线（全黑行）
    :param kline_img: K线图像（BGR格式，OpenCV图像）
    :param min_black_ratio: 行中黑色像素的最小占比（默认0.95，允许少量非黑像素）
    :return: 黑色分隔线的Y坐标列表（按从上到下排序）
    """
    if kline_img is None or kline_img.size == 0:
        logging.error("查找分隔线失败：K线图像为空")
        return []
    
    # 获取图像尺寸（高度=行数，宽度=每行像素数）
    height, width = kline_img.shape[:2]
    black_lines = []
    
    # 逐行遍历（Y轴方向）
    for y in range(height):
        if 4 > y:
            continue
        # 获取当前行的所有像素（BGR格式）
        row = kline_img[y, :]  # shape: (width, 3)
        
        # 判断每个像素是否为黑色（B=0, G=0, R=0）
        # 允许微小偏差（如(0,0,1)也视为黑色）
        is_black_pixel = np.all(row <= [10, 10, 10], axis=1)  # 宽容度：BGR均≤10
        
        # 计算当前行中黑色像素的占比
        black_ratio = np.mean(is_black_pixel)
        
        # 若黑色像素占比超过阈值，视为分隔线
        if black_ratio >= min_black_ratio:
            black_lines.append(y)
            logging.debug(f"找到黑色分隔线：Y={y}（黑色占比：{black_ratio:.2f}）")
    
    return black_lines

def extract_main_chart(kline_img):
    """
    从K线图像中截取主图（基于黑色分隔线）
    :param kline_img: K线图像（BGR格式）
    :return: 主图区域（BGR格式），失败返回None
    """
    # 查找所有黑色分隔线
    separators = find_black_separators(kline_img)
    
    if not separators:
        logging.warning("未找到黑色分隔线，无法确定主图范围")
        #  fallback：返回上半部分（假设主图占上2/3）
        height = kline_img.shape[0]
        main_height = int(height * 2 / 3)
        return kline_img[:main_height, :].copy()
    
    # 主图通常在最上方的分隔线之前（或第一个和第二个分隔线之间）
    # 取第一条分隔线作为主图底部边界
    main_bottom = separators[0]
    # 主图顶部从0开始
    main_top = 0
    
    # 截取主图区域（Y从main_top到main_bottom，X全宽）
    main_chart = kline_img[main_top:main_bottom, :].copy()
    # logging.info(f"主图截取完成：范围（Y={main_top}至Y={main_bottom}），尺寸{main_chart.shape[1]}×{main_chart.shape[0]}")
    
    return main_chart